#!/bin/bash

# 脚本放在服务器 /www/admin/hzqc/serve/tmp 下, 权限700
# 启动逻辑
# 检测是否存在运行的进程
# 如果有大于1个正在运行的进程，脚本终止运行
# 如果仅有1或者0个进程时，步骤如下
# 根据现有进程在8002和8003之间相互切换，如果没有正在运行的进程，默认8002
# 从jenkins ssh传输目录sshpath移动jar到目标节点目录，会进行文件检测
# 启动进程，60秒后检测是否启动
# 检测10次间隔15秒
# 启动成功后杀旧进程(如果存在)
# 网关会进行自动监听并自动剔除下线节点
# 注意：本脚本运行路径会影响log的生成位置，根据实际情况调整位置


# JENKINS标识
export BUILD_ID=dontKillMe
set -e
source /etc/profile
# 默认端口 当前无运行则使用改端口
next_port="8002"
# 候选端口
candidate_port="8003"
# spring boot profile
env_profile=dev
jar_name=hzqc-system-2.0.jar
# JENKINS ssh 目录
ssh_path=/www/admin/hzqc/serve/tmp
# jar运行目录前缀 + 节点号（端口号）就是路径
serve_path=/www/admin/hzqc/serve/serve_
# 日志路径 不一定生效 取决于logback文件中的配置
log_path=/www/admin/hzqc/serve/logs
started=$SECONDS


function countdown() {
  i=$1
  printf "%s秒后%s " "$1" "$2"
  while [ "$((i--))" -gt 0 ]; do
         sleep 1
         printf ">"
  done
}

function echo_warning() {
    echo -e "\\033[33m$1\\033[0m"
}

function echo_info() {
    echo -e "\\033[32m$1\\033[0m"
}

function echo_error() {
    echo -e "\\033[31m$1\\033[0m"
}

echo "检测进程中……"
pid=$(pgrep -f "$jar_name")

if [[ -n "$pid" ]]; then
    if [ "$(pgrep -f "$jar_name" | wc -l)" -gt 1 ]; then
        echo_error "当前存在多个进程: $pid ,需手动排查,终止部署任务"
        exit 1
    fi
    echo "当前进程: $pid"
    # 查找对应的端口号 一个进程可能对应多个端口  提取 8002 或者 8003
    cur_port=$(netstat -tlnp | grep "$pid" | awk '{if (substr($4,4)=='"$next_port"'||substr($4,4)=='"$candidate_port"') print substr($4,4)}')
    echo "当前进程节点: $cur_port"
    if [[ "$cur_port" == "$next_port" ]]; then
        next_port="$candidate_port"
    fi
else
    echo_warning "未检测到正在运行中的进程"
fi
echo -e "即将部署节点: \033[42;37m$next_port\033[0m"
if [ -e "$ssh_path/$jar_name" ]; then
    echo "正在拷贝 $ssh_path/$jar_name 到运行目录 $serve_path$next_port/"
#    cp -u "$ssh_path/$jar_name" "$serve_path$next_port/"
    mv -f -v "$ssh_path/$jar_name" "$serve_path$next_port/"
else
    echo_error "部署包 $ssh_path/$jar_name 不存在，终止执行"
    exit 1
fi
echo "正在启动(60s等待)……"
# 指定spring boot 端口  指定配置文件路径  指定环境  指定日志路径
nohup java -Dserver.port=$next_port \
           -Dspring.config.additional-location=file:"$serve_path$next_port"/config/ \
           -Dspring.profiles.active="$env_profile" \
           -Dlogging.path="$log_path" \
           -jar "$serve_path$next_port/$jar_name" >"$log_path"/start_log.out 2>&1 &
countdown 60 "检测服务启动状态"
if [ "$(pgrep -f "$jar_name" | wc -l)" -eq 0 ]; then
    echo_error "未检测到启动进程，请手动排查处理"
    exit 1
fi
echo -e "\n开始检测服务是否启动，15秒检测一次，尝试10次后失败"
for i in {1..10} ; do
    # 需要/actuator/health端点支持
    if curl -s http://localhost:"$next_port"/actuator/health | grep -q "\"status\":\"UP\""; then
        cur_pid=$(pgrep -a java | grep -E $next_port."$jar_name" | awk '{print $1}')
        echo -e "\n第 $i 次检测服务状态: \033[32m运行中 \033[0m PID: \033[35m$cur_pid\033[0m NODE: \033[36m$next_port\033[0m"
        if [[ -n "$pid" ]]; then
             echo "正在关闭旧进程: kill -15 $pid"
             kill -15 "$pid"
        fi
        echo "部署完毕, 耗时$((SECONDS-started))秒"
        exit 0
    else
        echo -e "\n第 $i 次检测服务状态: \033[33m启动中\033[0m"
        if [ "$i" -ge 10 ]; then
            echo_error "检测超时，请手动排查处理"
            exit 1
        fi
    fi
    countdown 15 "再次检测"
done